package framework;

import java.lang.reflect.Field;
import java.util.Date;
import java.util.GregorianCalendar;

import framework.formfields.FormCheckboxField;
import framework.formfields.FormComboField;
import framework.formfields.FormDateField;
import framework.formfields.FormRadioField;
import framework.formfields.FormTextField;

public class GeradorForm<T> {

	private String[] atributos;
	private FormField[] fields;
	
	public GeradorForm(Class<?> classe){
		String nomeDoCampo = "";
		Class<?> tipoDoCampo;
		atributos = new String[classe.getFields().length];
		fields = new FormField[classe.getFields().length];
		
		int i = 0;
		try {
			for(Field atributo : classe.getFields()){
				nomeDoCampo = atributo.getName();
				tipoDoCampo = atributo.getType();
				atributos[i] = nomeDoCampo;
				
				if(tipoDoCampo.equals(String.class)){
					fields[i] = new FormTextField(atributo, nomeDoCampo);
				}			
				if(tipoDoCampo.equals(Date.class)){
					fields[i] = new FormDateField(atributo, nomeDoCampo);
				}
				if(tipoDoCampo.equals(String[].class)){
					// need options
					fields[i] = null;
				}
				if(tipoDoCampo.equals(boolean.class)){
					fields[i] = new FormCheckboxField(atributo, nomeDoCampo);
				}
				i++;
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
	}
	
	public void setFormField(String nomeAtributo, FormField field) throws NoSuchFieldException
	{
		int i;
		for (i=0; i<atributos.length; i++)
		{
			if (nomeAtributo.equals(atributos[i]))
			{
				fields[i] = field;
				return;
			}
		}
		if (i == atributos.length)
		{
			throw new NoSuchFieldException();
		}
	}
		
	public String gerarHtmldosCampos(T objeto) throws IllegalArgumentException, IllegalAccessException{
		String htmlGerado = "";
		String linhaGerada = "";
		htmlGerado += "<form><table  border=\"2\">\n";
		try {
			for (int i=0; i<fields.length; i++)
			{
				if (fields[i] != null)
				{
					linhaGerada = fields[i].gerarLinha(objeto);
					htmlGerado += linhaGerada;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} catch (Throwable e) {
			e.printStackTrace();
		}
		htmlGerado += "</table></form>\n";
		return htmlGerado;
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException  {
		Cliente cliente = new Cliente();
		cliente.setNome("Joao Paulo dos Santos");
		cliente.setDateNasc(new GregorianCalendar(2009,8,2).getTime()); // GregorianCalendar's month is 0-based
		cliente.setSexo("masculino");
		cliente.setEstadoCivil("solteiro");
		cliente.setLogin("joaofasdf");
		cliente.setPassword("asdasdasd");
		cliente.setFuncoes(new String[]{"arquiteto","projetista"});
		cliente.setProjetos(new String[]{"projeto1","projeto3","projeto5"});
		cliente.setAutoriza(true);
		cliente.setObs("Nada mais a declarar");
		GeradorForm<Cliente> geradorForm = new GeradorForm<Cliente>(Cliente.class);
		try {
			geradorForm.setFormField("estadoCivil", new FormComboField(Cliente.class.getField("estadoCivil"), "Estado Civil",
					new String[]{"solteiro", "casado", "divorciado", "desquitado", "viuvo"}));
			geradorForm.setFormField("sexo", new FormRadioField(Cliente.class.getField("sexo"), "Sexo",
					new String[]{"masculino", "feminino"}));
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
		String html = "<html><head></head><body>\n" + geradorForm.gerarHtmldosCampos(cliente) + "</body></html>\n";
		System.out.println(html);
	}

}
